package qfmail

import (
	"bytes"
	"embed"
	"strconv"
	"strings"
	"text/template"
	"time"

	qfcfg "Projects/CavaCloudSys/cavasmusrc/com.qfcfg"

	"github.com/pkg/errors"
	"gopkg.in/gomail.v2"
)

// MakeBodyFromTemplate 从指定的文件系统中加载并渲染指定的邮件模板，
// 模板路径示例：templates/mail/auth/activate。
// 请根据邮件模板目录下的 README 传入对应的 data 参数。
func MakeBodyFromTemplate(assets embed.FS, templatePath string, data map[string]interface{}) ([]byte, error) {
	if !strings.HasSuffix(templatePath, ".html") {
		templatePath += ".html"
	}

	// 预定义的模板变量
	data["year"] = time.Now().Year()

	t, err := template.ParseFS(assets, templatePath)
	if err != nil {
		return nil, errors.Wrap(err, "parse")
	}

	var tpl bytes.Buffer
	if err := t.Execute(&tpl, data); err != nil {
		return nil, errors.Wrap(err, "execute")
	}
	return tpl.Bytes(), nil
}

// SendMail def
func SendMail(mailTo []string, subject string, body string, senderName string) error {
	//定义邮箱服务器连接信息，如果是网易邮箱 pass填密码，qq邮箱填授权码
	mailConn := map[string]string{
		"user": qfcfg.ServerConfig.Server.Mail.Username,
		"pass": qfcfg.ServerConfig.Server.Mail.Password.Value,
		"host": qfcfg.ServerConfig.Server.Mail.Host,
		"port": qfcfg.ServerConfig.Server.Mail.Port,
	}

	port, _ := strconv.Atoi(mailConn["port"]) //转换端口类型为int

	m := gomail.NewMessage()

	m.SetHeader("From", m.FormatAddress(mailConn["user"], senderName)) //这种方式可以添加别名，即“XX官方”
	//说明：如果是用网易邮箱账号发送，以下方法别名可以是中文，如果是qq企业邮箱，以下方法用中文别名，会报错，需要用上面此方法转码
	//m.SetHeader("From", "FB Sample"+"<"+mailConn["user"]+">") //这种方式可以添加别名，即“FB Sample”， 也可以直接用<code>m.SetHeader("From",mailConn["user"])</code> 读者可以自行实验下效果
	//m.SetHeader("From", mailConn["user"])
	m.SetHeader("To", mailTo...)    //发送给多个用户
	m.SetHeader("Subject", subject) //设置邮件主题
	m.SetBody("text/html", body)    //设置邮件正文

	d := gomail.NewDialer(mailConn["host"], port, mailConn["user"], mailConn["pass"])

	err := d.DialAndSend(m)
	return err
}
